package br.com.dlm.simuladoitil.controle;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

import br.com.dlm.simuladoitil.basicas.Alternativa;
import br.com.dlm.simuladoitil.basicas.Categoria;
import br.com.dlm.simuladoitil.basicas.Questao;
import br.com.dlm.simuladoitil.util.ArquivoJSON;

public class RepositorioNuvem {

    private InputStream lerArquivo() throws IOException, RuntimeException {
        try {
            HttpURLConnection conexao = (HttpURLConnection) new URL("http://simulado-itil.googlecode.com/svn/trunk/Base.json").openConnection();

            conexao.setReadTimeout(10 * 1000);
            conexao.setConnectTimeout(15 * 1000);
            conexao.setDoInput(true);
            conexao.setRequestMethod("GET");

            conexao.connect();

            if (conexao.getResponseCode() == HttpURLConnection.HTTP_OK){
                return conexao.getInputStream();
            } else {
                return null;
            }
        } catch (RuntimeException excecao) {
            throw excecao;
        }
    }

    private String inputStreamToString(InputStream inputStream) throws IOException {
        if (inputStream != null) {
            byte[] buffer = new byte[1024];
            int bytesLidos;
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            while ((bytesLidos = inputStream.read(buffer)) > -1){
                byteArrayOutputStream.write(buffer, 0, bytesLidos);
            }
            return new String(byteArrayOutputStream.toByteArray());
        } else {
            return null;
        }
    }

    public ArquivoJSON obterArquivoJSON() throws JSONException, IOException, RuntimeException {
        ArquivoJSON arquivoJSON = new ArquivoJSON();

        JSONObject jsonObjectRaiz = new JSONObject(inputStreamToString(lerArquivo()));

        arquivoJSON.vesrao = jsonObjectRaiz.getDouble("versao");
        arquivoJSON.categorias = new ArrayList<Categoria>();

        JSONArray jsonArrayCategorias = jsonObjectRaiz.getJSONArray("categorias");
        for (int indexCategoria = 0; indexCategoria < jsonArrayCategorias.length(); indexCategoria++) {
            JSONObject jsonObjectCategoria = jsonArrayCategorias.getJSONObject(indexCategoria);

            Categoria categoria = new Categoria(
                    jsonObjectCategoria.getString("id"),
                    jsonObjectCategoria.getString("nome"),
                    jsonObjectCategoria.getString("descricao"),
                    new ArrayList<Questao>());

            arquivoJSON.categorias.add(categoria);

            JSONArray jsonArrayQuestoes = jsonObjectCategoria.getJSONArray("questoes");

            if (jsonArrayQuestoes.length() > 0) {
                for (int indexQuestao = 0; indexQuestao < jsonArrayQuestoes.length(); indexQuestao++) {
                    JSONObject jsonObjectQuestao = jsonArrayQuestoes.getJSONObject(indexQuestao);

                    Questao questao = new Questao(
                            jsonObjectQuestao.getString("id"),
                            jsonObjectQuestao.getString("pergunta"),
                            new ArrayList<Alternativa>(),
                            jsonObjectQuestao.getString("idAlternativaCorreta")
                    );

                    categoria.questoes.add(questao);

                    JSONArray jsonArrayAlternativas = jsonObjectQuestao.getJSONArray("alternativas");

                    if (jsonArrayAlternativas.length() > 0) {
                        for (int indexAlternativa = 0; indexAlternativa < jsonArrayAlternativas.length(); indexAlternativa++) {
                            JSONObject jsonObjectAlternativa = jsonArrayAlternativas.getJSONObject(indexAlternativa);

                            Alternativa alternativa = new Alternativa(
                                    jsonObjectAlternativa.getString("id"),
                                    jsonObjectAlternativa.getString("texto")
                            );

                            questao.alternativas.add(alternativa);
                        }
                    }
                }
            }
        }
        return arquivoJSON;
    }
}
